fn main() {
    let mut s = String::from("hello world");

    // 获取第一个单词
    let word = first_word_index(&s); // s 的引用作为参数, 不会移动或复制 s 的数据

    s.clear(); // 清空字符串

    // `word` 仍然有效，因为它是对 `s` 的引用，而不是 `s` 本身,但是word长度本身已经不代表s的长度，所以不能使用word来获取s

    println!("the first word is: {}", word);
    println!("s is {}", s);

    let s1 = String::from("hello world");

    // 切片\
    // 注意字符串切片的边界是 位于 UTF-8 字符边界上，而不是字节边界上。
    let hello = &s1[0..5]; // 等价于 &s1[..5];
    let world = &s1[6..11]; // 等价于 &s1[6..];

    println!("hello is {}", hello);
    println!("world is {}", world);

    let s2 = String::from("hello world");

    let word = first_word(&s2);

    // s2.clear(); // 错误，因为word 还在引用s2的数据，所以不能修改s2
    println!("the first word is: {}", word);
    
}

fn first_word_index(s: &String) -> usize {
    let bytes = s.as_bytes();// 将字符串转换为字节数组

    // 迭代字节数组
    for (i, &item) in bytes.iter().enumerate() {
        // 找到空格，返回索引
        if item == b' ' {
            return i;// 返回索引
        }
    }
    // 如果没有找到空格，返回整个字符串的长度
    s.len()
}

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}